home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / pcmagazi / 1989 / 02 / export.asm < prev    next >
Assembly Source File  |  1988-10-27  |  5KB  |  221 lines

  1. ;----------------------------------------------------------------------
  2. ;Typical usage: EXPORT NETNAME <FILENAME
  3. ;
  4. ;Sends standard input across network from name EXPORT_NETNAME<10>
  5. ;to name IMPORT_NETNAME<10>.
  6. ;Network traffic is overlapped with Disk I/O to demonstrate the
  7. ;use of the No-Wait function of NETBIOS without needing an interrupt
  8. ;handler (POST=0).  This program takes best advantage of
  9. ;intelligent adapters with network coprocessors.
  10. ;
  11. ;Author: Jack Schoof, President, ARTISOFT, Inc.
  12. ;Copyright (c) 1989 Ziff Communications Co. * PC Magazine
  13. ;----------------------------------------------------------------------
  14. NCBDEF    STRUC                ;NCB DEFINITION
  15. NCB_COMMAND    DB 0
  16. NCB_RETCODE    DB 0
  17. NCB_LSN     DB 0
  18. NCB_NUM     DB 0
  19. NCB_BUFFER    DD 0            ;POINTER TO MESSAGE BUFFER
  20. NCB_LENGTH    DW 0            ;NUMBER OF BYTES IN BUFFER
  21. NCB_CALLNAME    DB 16 DUP (0)
  22. NCB_NAME    DB 16 DUP (0)
  23. NCB_RTO     DB 0
  24. NCB_STO     DB 0
  25. NCB_POST    DD 0            ;POINTER TO POST ADDRESS
  26. NCB_LANA_NUM    DB 0
  27. NCB_CMD_CPLT    DB 0
  28. NCB_RESERVED    DB 14 DUP (0)        ;RESERVED
  29. NCBDEF    ENDS
  30.  
  31. NO_WAIT         EQU 80H        ;NCB COMMANDS
  32. NCB_ADD_NAME        EQU 30H
  33. NCB_CALL        EQU 10H
  34. NW_DELETE_NAME        EQU 31H+NO_WAIT
  35. NW_HANG_UP        EQU 12H+NO_WAIT
  36. NW_SEND         EQU 14H+NO_WAIT
  37.  
  38. MAIN_DATA SEGMENT PUBLIC 'DATA'
  39.  
  40. CNCB    NCBDEF <>
  41.  
  42.     ORG CNCB.NCB_NAME
  43.     DB 'EXPORT_'        ;OUR NAME IS EXPORT_NETNAME
  44.     ORG CNCB.NCB_NAME+15
  45.     DB 10            ;10 TO NOT CONFLICT WITH NETWORK OPERATING
  46.     ORG CNCB.NCB_CALLNAME    ;SYSTEMS LIKE IBM PC LAN OR LANTASTIC NOS
  47.     DB 'IMPORT_'          ;RECEIVER'S NAME IS IMPORT_NETNAME
  48.     ORG CNCB.NCB_CALLNAME+15
  49.     DB 10            ;A 10 ON THE END TOO
  50.     ORG CNCB+SIZE NCBDEF
  51.  
  52. FLENGTH        DW    0    ;KEEPS THE LENGTH OF THE RECEIVED PACKET
  53. ERROR_MESSAGE    DB    ' NETBIOS ERROR: ERROR '
  54. ERROR_SWITCH    DB    1 DUP(0)
  55. ERROR_BUFFER    DB    1 DUP(0)
  56.  
  57. BUFFER_ONE    DB    4000H DUP (?) ;DISK BLOCK BUFFERS
  58. BUFFER_TWO    DB    4000H DUP (?) ;16K EACH
  59.  
  60. MAIN_DATA ENDS
  61.  
  62. MAIN_CODE SEGMENT PUBLIC 'CODE'
  63.     ASSUME CS:MAIN_CODE, DS:MAIN_DATA
  64.  
  65. BEGIN:    PUSH ES
  66.     POP DS                ;PUT PSP SEGMENT IN DS
  67.     MOV AX,SEG MAIN_DATA
  68.     MOV ES,AX            ;OUR DATA SEGMENT IN ES
  69.  
  70.     MOV SI,5DH            ;GET THE NAME POINTER
  71.     MOV DI,OFFSET CNCB.NCB_NAME+7
  72.     MOV CX,8
  73.     REP MOVSB            ;MAKE EXPORT_NETNAME<10>
  74.  
  75.     MOV SI,5DH
  76.     MOV DI,OFFSET CNCB.NCB_CALLNAME+7
  77.     MOV CX,8
  78.     REP MOVSB            ;MAKE IMPORT_NETNAME<10>
  79.  
  80.     MOV DS,AX
  81.     MOV WORD PTR CNCB.NCB_BUFFER+2,AX ;SET UP THE BUFFER SEGMENT FOR LATER
  82.  
  83.     MOV CNCB.NCB_COMMAND,NCB_ADD_NAME
  84.     CALL NETBIOS
  85.     JNZ BAD_EXIT            ;ADD OUR NAME TO THE ADAPTER
  86.  
  87. CALLUM: MOV CNCB.NCB_COMMAND,NCB_CALL    ;CALL THE IMPORTER
  88.     CALL NETBIOS
  89.     JZ  MAIN_LOOP
  90.     PUSHF
  91.     CALL ERROR_MSG
  92.     POPF
  93.     JNZ DELETE_NAME         ;NO ONE HOME? QUIT
  94. ;HERE IS WHERE WE SEND THE FILE
  95. MAIN_LOOP:
  96.     MOV DX,OFFSET BUFFER_ONE
  97.     CALL READ_BUFFER
  98.     JC HANG_UP            ;PROBLEMS ON READ, HANG UP
  99.  
  100.     CALL SEND_BUFFER        ;SEND THE BUFFER WITH NO WAIT
  101.     JNZ HANG_UP            ;PROBLEMS? THEN QUIT
  102.  
  103.     CMP FLENGTH,0            ;ARE WE DONE?
  104.     JZ CLOSE_FILE            ;YES
  105.  
  106.     MOV DX,OFFSET BUFFER_TWO
  107.     CALL READ_BUFFER        ;GET THE NEXT ONE OFF THE DISK
  108.     CALL WAIT_MYSELF        ;WAIT FOR THE PREVIOUS NCB
  109.     JNZ HANG_UP
  110.  
  111.     CALL SEND_BUFFER
  112.     JNZ HANG_UP            ;PROBLEMS?
  113.  
  114.     CALL WAIT_MYSELF        ;NOW WAIT FOR THE NCB
  115.     JNZ HANG_UP
  116.  
  117.     CMP FLENGTH,0            ;ARE WE DONE?
  118.     JZ CLOSE_FILE            ;YES
  119.     JMP MAIN_LOOP            ;CONTINUE
  120. CLOSE_FILE:
  121.     MOV AH,3EH
  122.     XOR BX,BX
  123.     INT 21H             ;CLOSE THE INPUT FILE
  124. HANG_UP:
  125.     MOV CNCB.NCB_COMMAND,NW_HANG_UP
  126.     CALL NETBIOS            ;HANG UP NOW
  127.     JNZ DELETE_NAME
  128.  
  129.     CALL WAIT_MYSELF
  130.     JNZ DELETE_NAME
  131. DELETE_NAME:
  132.     CALL NETBIOS            ;GET RID OF OUR NAME
  133.     JNZ BAD_EXIT
  134.  
  135.     CALL WAIT_MYSELF
  136.     JNZ BAD_EXIT
  137.  
  138.     MOV AX,4C00H            ;NO ERROR RETURN CODE
  139.     INT 21H             ;AND EXIT
  140. BAD_EXIT:
  141.     CALL ERROR_MSG
  142.     MOV AX,4C01H            ;SET AN ERROR RETURN CODE
  143.     INT 21H             ;AND EXIT
  144. WAIT_MYSELF:
  145.     MOV AL,CNCB.NCB_CMD_CPLT    ;WAIT FOR THE COMMAND
  146.     CMP AL,0FFH            ;TO HAVE DONE SOMETHING
  147.     JZ TEST_CHAR            ;WAIT FOR A CHARACTER
  148.     XOR AL,AL
  149.     RET                ;Z FLAG IS ON
  150. TEST_CHAR:
  151.     MOV AH,1
  152.     INT 16H             ;IS A CHARACTER AVAILABLE?
  153.     JZ WAIT_MYSELF
  154.     XOR AH,AH
  155.     INT 16H
  156.     OR AL,0FFH            ;NZ FLAG IS ON
  157.     RET
  158.  
  159. READ_BUFFER PROC
  160.     MOV AH,3FH
  161.     XOR BX,BX
  162.     MOV CX,SIZE BUFFER_ONE
  163.     INT 21H             ;READ IN THE BUFFER POINTED TO BY DX
  164.     MOV FLENGTH,AX            ;SAVE THE ACTUAL LENGTH
  165.     RET
  166. READ_BUFFER ENDP
  167.  
  168. SEND_BUFFER PROC
  169.     MOV WORD PTR CNCB.NCB_BUFFER,DX ;WHAT TO SEND
  170.     MOV AX,FLENGTH
  171.     MOV CNCB.NCB_LENGTH,AX        ;LENGTH TO SEND
  172.     MOV CNCB.NCB_COMMAND,NW_SEND
  173. NETBIOS PROC
  174.     MOV BX,OFFSET CNCB        ;ES:BX POINTS TO NCB
  175.     INT 5CH             ;CALL THE ADAPTER
  176.     TEST AL,AL            ;CHECK FOR PROBLEMS
  177.     RET                ;AND RETURN WITH FLAGS SET
  178. NETBIOS ENDP
  179. SEND_BUFFER ENDP
  180.  
  181. ERROR_MSG   PROC
  182.     MOV ERROR_SWITCH,01        ;SET SWITCH FOR ONLY ONE MESSAGE
  183.     MOV CX,22
  184.     LEA DX,ERROR_MESSAGE        ;PRINT OUT ERROR MESSAGE
  185.     MOV BX,2            ;TO STANDARD DEVICE - NO REDIRECTION
  186.     MOV AH,40H
  187.     INT 21H
  188.     MOV BH,CNCB.NCB_RETCODE     ;MOVE RETURN CODE TO BH
  189.     MOV CL,04
  190.     MOV CH,02
  191. AGAIN:
  192.     ROL BX,CL            ;ROUTINE TO CONVERT BINARY TO
  193.     MOV AL,BL            ;HEX
  194.     AND AL,0FH
  195.     ADD AL,30H
  196.     CMP AL,39H
  197.     JLE PRINT_CHAR
  198.     ADD AL,7
  199. PRINT_CHAR:
  200.     MOV ERROR_BUFFER,AL
  201.     PUSH CX
  202.     MOV CX,1
  203.     LEA DX,ERROR_BUFFER        ;PRINT OUT ERROR MESSAGE
  204.     PUSH BX             ;TO STANDARD DEVICE - NO REDIRECTION
  205.     MOV BX,2
  206.     MOV AH,40H
  207.     INT 21H
  208.     POP BX
  209.     POP CX
  210.     DEC CH
  211.     JNZ AGAIN
  212.     RET
  213. ERROR_MSG   ENDP
  214.  
  215. MAIN_CODE ENDS
  216.  
  217. MAIN_STACK    SEGMENT STACK
  218.     DW 100H DUP (?)         ;DEFAULT STACK
  219. MAIN_STACK    ENDS
  220.     END BEGIN
  221.